let interceptorsReq = []
let interceptorsReqError = []
let interceptorsRes = []
let interceptorsResError = []
// 定义用来存储拦截请求和拦截响应结果的处理和错误结果处理的函数集合

export function myFetch<T>(url: string, reqData: object = {}) {
  // interceptorsReq是拦截请求的拦截处理函数集合
  interceptorsReq.forEach((reqFn) => {
    reqData = reqFn(reqData)
  })

  // 在原生fetch外面封装一个promise，为了在promise里面可以对fetch请求的结果做拦截处理。
  // 同时，保证Cfetch函数返回的结果是个promise对象。
  return new Promise((resolve, reject) => {
    // 发起fetch请求，fetch请求的形参是接收上层函数的形参
    fetch(url, reqData)
      .then(response=>{
        return response.json()
      })
      .then((res) => {
        // interceptorsRes是拦截响应结果的拦截处理函数集合
        interceptorsRes.forEach((resFn) => {
          // 拦截器对响应结果做处理，把处理后的结果返回给响应结果。
          res = resFn(res)
        })
        if(res.code ===0){
          // 将拦截器处理后的响应结果resolve出去
          resolve(res.data as T)
        }else {
          reject()
        }
        
      })
      .catch((err) => {
        // interceptorsResError是拦截响应错误结果的拦截处理函数集合
        interceptorsResError.forEach((resErrorFn) => {
          // 拦截器对响应错误结果做处理，把处理后的结果返回给响应结果。
          err = resErrorFn(err)
        })
        reject(err)
      })
  })
}
